<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        function test(num) {
            return Promise.resolve(num * 2);
        }
        
        function * generator(num) {
            // console.log(num);
            const value1 = yield test(num);
            // console.log(value1);
            const value2 = yield test(value1);
        }

       // async 的作用就是将这个生成器函数和自执行器一起封装
       function asyncFunction (generatorFunc) {
            return  new Promise((resolve, reject) => {
                // 获取这个生成器函数
                const gen = generatorFunc(2) // 这里传递的值可以是作用域中的值

                // 链式处理 yield
                const doYield = (val) => {
                    console.log(val);
                    let res 

                    try {
                        res = gen.next(val) // 这是个迭代器
                    } catch (err) {
                        reject(err)
                    }
                    // 拿到迭代器中的数据
                    if (res.done) { // 说明已经完成了
                        return  resolve(res.value)
                    } else {
                        res.value.then(result => doYield(result)) // 循环的去调用这些值
                    }
                }
                doYield()
            })
       }

       asyncFunction(generator)()
    </script>
</body>
</html>
